<?php
/**
 * @(#)csvutil.php
 * PHP version 5.2.3
 *
 * Copyright 2008 lucent-global. All Rights Reserved.
 *
 *====================================================================
 * 変更履歴
 *
 * 新規作成                            2010 年10月20日   周金柱
 */

/**
 * CSVの処理
 *
 */
class CsvUtil
{
	// 类名
	private $className = "CsvUtil";
	
	// 输出文件名
	private $outFileName = "";
	
	// 文件标题
	private $tilte = array();
	
	//输出的数据
	private $data = array();
	
	// ファイルのポイント
	private $mFp = "";
	
	// 文件名
	private $fileName = "";
	
	// 文件后缀
	private $extendName="csv";
	// ファイルの一時パス
	private $mPath = "";
	// ファイルのフルパス
	private $fullPath = "";
	// CSVのタイトル
	private $mHead = "";
	// CSVの内容
	private $mBody = "";
	// ログ
	private $log = "";
	// 共通

	private $common = false;
	

	/**
	 * 初期化

	 *
	 * @param string	$fName	ファイル名

	 * @param array		$title	ファイルのタイトル
	 * @param array		$data	出力されるデータ
	 */
	public function CsvUtil($fName, $title, $data)
	{
		// ログの初期化

		// ファイル名のencodingの変更
		$fName = mb_convert_encoding($fName, "Windows-31j", ENCODE);
		// 出力したファイル名

		$this->outFileName = $fName;
		// タイトル
		$this->title = $title;
		// 出力されるデータ
		$this->data = $data;

	}

	/**
	 * CSVの出力

	 *
	 * @return OKの場合：ＣＳＶファイルを出力する

	 *		  NGの場合：システムエラー画面へ遷移する
	 */
	public function outputCsv()
	{

		// csvファイルの作成
		$path = $this->createCsv($this->title, $this->data);
		// csvファイルの出力

		$this->openFile($path,"r");
		// ファイルポイントがない場合

		if(!$this->mFp)
		{
			return "文件夹打开失败！";
			// システムエラー画面に遷移する
			exit;
		}
		// Send a raw HTTP header
		header("Pragma: public");
		header("Expires: 0");
		header("Expires: " . gmdate("D, d M Y H:i:s", time()+24*60*60) . " GMT");
		header("Last-Modified: ".gmdate("D, d M Y H:i:s") . " GMT");
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
		header("Cache-Control: public");
		header("Content-Description: File Transfer");
		header("Vary: User-Agent");
		header("Content-type:application/vnd.ms-excel");
		Header("Accept-Ranges: bytes");
		Header("Accept-Length: ".filesize($path));
		Header("Content-Disposition: attachment; filename=".$this->outFileName.".".$this->extendName);
		// ファイルを読み込む
		$rResult = fread($this->mFp,filesize($path));
		// ファイルを読み込むは失敗する

		if($rResult === false)
		{
			return "ファイルの読み込むは失敗する。";
			exit;
		}
		// ファイルを読み込むは成功する
		else
		{
			// ファイルを出力する
			echo $rResult;
		}
		// ファイルポイントを閉じる

		$this->closeFile();		
		// csvファイルがある場合

		if (file_exists($path))
		{
			// csvファイルの削除
			unlink($path);
		}
	}

	/**
	 * ファイルを開く

	 *
	 * @param string $path		ファイルのパス
	 * @param string $mode		ファイルの開くモード

	 * @return string or false
	 */
	private function openFile($path, $mode="w")
	{
		// 一時ファイル名がない場合

		if(empty($this->fileName))
		{
			// ファイルの名を設定する

			$this->setTimeFileName();
		}
		// ファイルの拡張子がない場合

		if (empty($this->extendName))
		{
			// ファイルの拡張子を設定する

			$this->setExtendName();
		}
		// ファイルを開く

		$fp = fopen($path, $mode);
		// ファイルを開くは成功する
		if($fp)
		{
			// ファイルのポイント

			$this->mFp = $fp;
		}
		// ファイルを開くは失敗する

		else
		{
			//$this->log->error("ファイルを開くは失敗する。".$this->fullPath);
			// システムエラー画面に遷移する。

			$this->common->goToErrorHtml(ERR026, "");
			//$this->log->info("</".$this->className.".openFile>");
			exit;
		}
		//$this->log->info("</".$this->className.".openFile>");
	}

	/**
	 * 多个CSVの出力

	 *
	 * @return OKの場合：ＣＳＶファイルを出力する

	 *		  NGの場合：システムエラー画面へ遷移する
	 */
	public function creatOneCsv($title,$result)
	{
		// csvファイルの作成
		$path = $this->createCsv($title, $result);
		// csvファイルの出力

		return $path;
		$this->log->info("</".$this->className.".outputMoreCsv>");
	}
	/**
	 * ファイルポイントを閉じる

	 * 
	 * @return fclose($this->mFp);                                                                                   
	 */
	private function closeFile()
	{
		if(fclose($this->mFp) === false)
		{
			// ファイルポイントを閉じるは失敗する

			return "ファイルポイントを閉じるは失敗する。";
			exit;
		}
		//$this->log->info("</".$this->className.".closeFile>");
	}

	/**
	 * ファイルの名を設定する

	 *
	 * @param string $type	タイムのフォーマット

	 */
	private function setTimeFileName($type="YmdHis")
	{

		if(!empty($type))
		{
			$this->fileName = date($type);
		}
		// タイムのフォーマットがない場合

		else
		{
			$this->fileName = time();
		}
	}

	/**
	 * ファイルの拡張子を設定する

	 *
	 * @param string $extend	ファイルの拡張子

	 */
	private function setExtendName($extend="csv")
	{
		// ファイルの拡張子がある場合

		if(!empty($extend))
		{
			$this->extendName=$extend;
		}
		// ファイルの拡張子がない場合

		else
		{
			$this->extendName="txt";
		}
	}
	
	/**
	 * ファイルのパスを設定する

	 *
	 * @param string $path
	 */
	private function setPath($path="./")
	{
		// ファイルのパスを設定する

		$this->mPath = $path;
	}

	/**
	 * CSVのタイトル
	 *
	 * @param array $head	ファイルのタイトル
	 */
	private function addHeader($head=array())
	{
		// ファイルのタイトルはarrayの場合

		if (is_array($head))
		{
			if(is_array($head))
	    	{
	    		$j = 0;
	    		foreach($head as $value)
	    		{
	    			$value = str_replace("\"","\"\"",$value);
	    			if($j != 0)
	    			{
	    				$this->mHead .= ",\"".$value."\"";
	    			}
	    			else
	    			{
	    				$this->mHead .= "\"".$value."\"";
	    			}
	    			$j++;
	    		}
	    	}
	   		$this->mHead .= "\r\n";
		}
	}

	/**
	 * CSVの内容
	 *
	 * @param array $body	出力されるデータ
	 */
	private function addBodyData($body=array())
	{
		// 出力されるデータはarrayの場合

		if(is_array($body))
		{
			foreach($body as $value)
		    {
		    	if(is_array($value))
		    	{
		    		$j = 0;
		    		foreach($value as $value1)
		    		{
		    			$value1 = str_replace("\"","\"\"",$value1);
		    			if($j != 0)
		    			{
		    				$this->mBody .= ",\"".$value1."\"";
		    			}
		    			else
		    			{
		    				$this->mBody .= "\"".$value1."\"";
		    			}
		    			$j++;
		    		}
		    	}
		   		$this->mBody .= "\r\n";
		    }
		}
	}

	/**
	 * CSVにデータを入力する

	 *
	 */
	private function writeCSVDate()
	{
		$result = fwrite($this->mFp, mb_convert_encoding($this->mHead.$this->mBody, "Windows-31j", ENCODE));
		// ファイルを作成するは失敗する

		if($result === false)
		{
			// ファイルを作成するは失敗する

			return "ファイルを作成するは失敗する。";
			exit;
		}
	}

	/**
	 * CSVファイルの作成
	 *
	 * @param array $title	ファイルのタイトル
	 * @param array $data	出力されるデータ
	 *
	 * @return OKの場合：ファイルのパス
	 *		   NGの場合：false
	 */
	private function createCsv($title, $data)
	{
		// ファイルのタイトルはarrayの場合
		if(is_array($title) && 0 < count($title))
		{
			// ファイルのタイトルを書く

			$this->addHeader($title);
		}
		// ファイルのタイトルはarray以外の場合

		else
		{
			return false;
		}
		// 出力されるデータはarrayの場合
		if(is_array($data) && 0 < count($data))
		{
			// 出力されるデータを書く

			$this->addBodyData($data);
		}
		// 出力されるデータはarray以外の場合

		else
		{
			//return false;
		}

		// create folder
		$dlpath = OUTCSVDIR;
		// ダウンロードパスをセットする
		$this->setPath($dlpath);

		// ファイルのフルパス
		$this->fullPath = $this->mPath.mb_convert_encoding($this->outFileName, ENCODE, "Windows-31j")
						.".".$this->extendName;
		// ファイルがないの場合、ファイルを作成するが失敗する場合

		if (!file_exists($this->mPath) && !mkdir($this->mPath, 0777))
		{
			return "該当するCSVファイルがありません。";
			exit;
		}
		// ファイルの名を設定する
		$this->setTimeFileName();
		// ファイルの拡張子を設定する

		$this->setExtendName();
		// ファイルの一時パス
		$path = $this->mPath.$this->fileName.".".$this->extendName;
		// ファイルを開く
		$this->openFile($path);
		// CSVにデータを入力する

		$this->writeCSVDate();
		// ファイルポイントを閉じる

		$this->closeFile();
		return $path;
	}
}
?>